package org.dromara.common.core.utils;

import org.springframework.validation.*;

import java.util.List;
import java.util.Objects;
import java.util.function.Supplier;
import java.util.regex.Pattern;

/**
 * 校验参数工具类
 */
public class ValidateUtil {

    /**
     * 校验参数
     * @param errrorMessageList 错误信息
     * @param object 校验对象
     * @param validator 自定义validator实现类
     * @return 错误信息
     */
    public static List<String> validate(List<String> errrorMessageList, Object object, Validator validator) {
        DataBinder binder = new DataBinder(object);
        binder.setValidator(validator);
        binder.validate();
        BindingResult result = binder.getBindingResult();
        if (result.hasErrors()) {
            for (ObjectError allError : result.getAllErrors()) {
                errrorMessageList.add(allError.getDefaultMessage());
            }
        }
        return errrorMessageList;
    }

    /**
     * 校验点位类型为点的值
     * @param lngAndLat 点位的值
     * @return true/false
     */
    public static Boolean validateWktPoint(String lngAndLat) {
        String regexp = "^POINT\\(\\s*(-?\\d+\\.\\d+)\\s*(-?\\d+\\.\\d+)\\s*\\)$";
        return Pattern.matches(regexp, lngAndLat);
    }

    /**
     * 校验点位类型为多边形的值
     * @param lngAndLat 点位的值
     * @return true/false
     */
    public static Boolean validateWktPolygon(String lngAndLat) {
        String regexp = "^POLYGON\\(\\(\\s*([\\d.]+)\\s+([\\d.]+)(?:,\\s*([\\d.]+)\\s+([\\d.]+))*(?:,\\s*\\1\\s*\\2)?\\)\\)$";
        return Pattern.matches(regexp, lngAndLat);
    }

    /**
     * 工具方法：检验参数是否为空（String）
     */
    public static void rejectIfEmpty(Supplier<String> supplier, String code,
                               String message, Errors errors) {
        if (StringUtils.isEmpty(supplier.get())) {
            errors.reject(code, message);
        }
    }

    /**
     * 工具方法：检验参数是否为空(Object)
     */
    public static void rejectIfNull(Supplier<Object> supplier, String code,
                              String message, Errors errors) {
        if (Objects.isNull(supplier.get())) {
            errors.reject(code, message);
        }
    }
}
